//
//  HYHomeTableViewController.swift
//  weibo-01
//
//  Created by 源 何 on 16/9/22.
//  Copyright © 2016年 何源. All rights reserved.
// 1.验证接口数据

import UIKit
import SVProgressHUD
import YYModel

private let originalCellId = "HYStatusCellId"
private let retweetedCellId = "HYRetweetedStatusId"

class HYHomeTableViewController: HYBaseTableViewController {
    
    //懒加载数据源数组
//    lazy var statuses : [HYStatus] = [HYStatus]()
    lazy var homeViewModel: HYHomeViewModel = HYHomeViewModel ()

    //实例化小菊花视图
    lazy var indicatorView: UIActivityIndicatorView = {
        let indicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.gray)
        return indicator
    } ()
    
    private lazy var tipLabel: UILabel = {
        let l = UILabel(title: "", textColor: UIColor.white, fontSize: 14)
        //设置背景颜色
        l.backgroundColor = UIColor.orange
        //设置对齐
        l.textAlignment = .center
        l.frame = CGRect(x: 0, y: 0, width: ScreenWidth, height: 35)
        l.isHidden = true
        return l
    }()
    
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //用户没有登录的情况下 tableView 实际上没有被创建,此时创建的视图是访客视图 如果没有做判断,程序会崩溃
        if !userLogin {
            
            visitorView.updateInfo(tipText: "关注一些人,快回到这里看看有什么惊喜", imageName: nil)
            
            return
        }
        
        navigationItem.rightBarButtonItem = UIBarButtonItem(imageName: "navigationbar_pop", target: self, action: #selector(push))
        
        //在请求数据之前就开始设置tableView
        setupTabelView()
        
        //请求数据
        loadData()
    }
    
    //设置tableView
    private func setupTabelView() {
        //注册原创微博cell
        let originalNib = UINib(nibName: "HYStatusCell", bundle: nil)
        //let bundlePath = Bundle.main.bundlePath
        tableView.register(originalNib, forCellReuseIdentifier: originalCellId)
        //注册转发微博cell
        let retweetedNib = UINib(nibName: "HYRetweetedStatus", bundle: nil)
        tableView.register(retweetedNib, forCellReuseIdentifier: retweetedCellId)
        
        //设置行高
        tableView.rowHeight = 360
        //设置分割线
        tableView.separatorStyle = .none
        //设置tableView footview
        tableView.tableFooterView = indicatorView
        
        //添加系统的刷新控件
//        refreshControl = UIRefreshControl()
        //添加监听事件
//        refreshControl?.addTarget(self, action: #selector(loadData), for: .valueChanged)
        let hyRefreshControl = HYRefreshControl()
        hyRefreshControl.addTarget(self, action: #selector(loadData), for: .valueChanged)
        self.view.addSubview(hyRefreshControl)
        
        //添加到导航视图控制器的view上
        self.tipLabel.frame.origin.y = navBarHeight - 35
        self.navigationController?.view.addSubview(tipLabel)
        
        //将tipLabel放到导航条下面
        self.navigationController?.view.insertSubview(tipLabel, belowSubview: self.navigationController!.navigationBar)
    }
    
    //加载网络数据
    internal func loadData() {
        homeViewModel.loadData(isPullup: indicatorView.isAnimating) { (success,count) in
            
            if !success {
                SVProgressHUD.showError(withStatus: errorTip)
                return
            }
            //停止动画
            self.refreshControl?.endRefreshing()
            //将小菊花转动停止
            self.indicatorView.stopAnimating()
            //执行label的动画效果
            self.startTipLabelAnimation(count: count)
            //成功 刷新数据
            self.tableView.reloadData()
        }
    }
    
    //提示刷新了多少条数据
    private func startTipLabelAnimation(count: Int){
        
        //如果正在做动画就直接return
        if self.tipLabel.isHidden == false {
            return
        }
        
        //设置文字
        self.tipLabel.text = count == 0 ? "没有新微博数据" : "有\(count)条新微博数据"
        //执行动画效果
        //动画执行前 修改alpha
        self.tipLabel.isHidden = false
        //在动画执行前先记录之前的Y值
        let lastY = self.tipLabel.frame.origin.y
        UIView.animate(withDuration: 1, animations: { 
            self.tipLabel.frame.origin.y = navBarHeight
            }) { (_) in
                //添加一个返回原位置的动画需要延迟
                UIView.animate(withDuration: 1, delay: 1, options: [], animations: { 
                    self.tipLabel.frame.origin.y = lastY
                    }, completion: { (_) in
                        self.tipLabel.isHidden = true
                })
        }
    }
    
    //按钮的监听方法
    @objc private func push() {
        
        let tempView = HYTempViewController()
        self.navigationController?.pushViewController(tempView, animated: true)
    }
}

//实现数据源方法
//UITableViewDataSource 重复继承某一个协议会报错
extension HYHomeTableViewController {
    
    //数据源有数据 而且reloadData 但是没有执行数据源方法
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        //使用懒加载的好处 不需要考虑可选类型的使用
        return homeViewModel.viewmodelArray.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let viewmodel = homeViewModel.viewmodelArray[indexPath.row]
        
        //使用这种方式自定义cell 需要提前注册
        //获取两种重用标识符不一样的同种类型的cell
        //同时也需要注册转发微博的cellID
        let cellID = getCellIdWithViewmodel(viewmodel: viewmodel)
        
        let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath) as! HYStatusCell

        cell.viewmodel = viewmodel
        
        return cell
    }
    
    //返回cell的行高的代理方法
    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        let viewmodel = homeViewModel.viewmodelArray[indexPath.row]
        //1.根据数据获取对应的cell
        let cellId = getCellIdWithViewmodel(viewmodel: viewmodel)
        //计算高度不能够通过从缓存吃中获取cell的方式
        //自己从nib中读取cell对象的方式 和 可重用的cell没有任何关系
        //获取不显示的cell 专门用来计算控件的frame
        let cell = cellWithId(cellID: cellId)
        let rowHeight = cell.rowHeight(viewmodel: viewmodel)
        //2.返回cell的toolBar的最大Y值
        return rowHeight
    }
    
    //将要显示最后一个cell的时候就开始执行静默加载
    override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        //将要显示倒数第二行并且 小菊花没有转动的时候,才开始加载更多数据
        if indexPath.row == homeViewModel.viewmodelArray.count - 2 && indicatorView.isAnimating == false {
            indicatorView.startAnimating()
            loadData()
        }
    }
    
    //根据数据获取对应的cell对象
    private func cellWithId(cellID: String) -> HYStatusCell{
        let nibName = cellID == originalCellId ? "HYStatusCell" : "HYRetweetedStatus"
        return UINib(nibName: nibName, bundle: nil).instantiate(withOwner: nil, options: nil).last as! HYStatusCell
    }
    
    //根据 viewModel 来判断应该使用哪个cell的ID
    private func getCellIdWithViewmodel(viewmodel: HYStatusViewModel) -> String {
        if viewmodel.status?.retweeted_status == nil {
            //原创微博
            return originalCellId
        }
        //转发微博
        return retweetedCellId
    }
}
